library(vegan)
library(broom)
library(MASS)
library(tidyverse)
## Do Not Run
#wExp <- readRDS("~/RMB/SoilDomestication/Data/wExp.rds")
#wExp %>% 
#  filter(Site == "Arkansas") %>% 
#  ungroup() %>% 
#  saveRDS("~/RMB/SoilDomestication/Data/native_plants_data.rds")
nExp <- readRDS("~/RMB/SoilDomestication/Data/native_plants_data.rds") %>% filter(SampleID != "Arw.22")
tax <- readRDS("~/RMB/SoilDomestication/Data/gg_otus_tax.rds")
long_pcoa <- function(x, samples = "SampleID", otus = "variable", value = "RA", dist = "bray"){
  to_drop <- otus
  metadata <- x %>% 
    dplyr::ungroup() %>% 
    purrr::discard(is.double) %>% 
    dplyr::select_(.dots = paste("-", to_drop)) %>% 
    dplyr::distinct()
  
  wide_table <- x %>% 
    dplyr::select_(samples, otus, value) %>% 
    tidyr::spread_(otus, value, fill = 0)
  
  pc <- vegan::capscale(log2(wide_table[,2:ncol(wide_table)] + 1) ~ 1, dist = dist)
  axes <- dplyr::bind_cols(metadata, dplyr::as_tibble(vegan::scores(pc, choices = c(1:5))$sites))
  eigen_vals <- vegan::eigenvals(pc) / sum(vegan::eigenvals(pc))
  
  return(list(axes = axes, eigen_vals = eigen_vals))
}
raref <- function(x, sampling_depth, value = "value", otus = "variable") {
  rare_values <- data.frame(table(sample(x$`variable`, sampling_depth, replace = T, prob = x$`value`/x$depth)))
  names(rare_values) <- c(otus, "rare_value")
  return(suppressMessages(left_join(x, rare_values, by = otus) %>% replace_na(list(rare_value = 0))))
}
long_adonis <- function(x, samples = "SampleID", otus = "variable", value = "RA", dist = "bray", formula) {
    to_drop <- otus
    metadata <- x %>% 
        dplyr::ungroup() %>% 
        purrr::discard(is.double) %>% 
        dplyr::select_(.dots = paste("-", to_drop)) %>% 
        dplyr::distinct()
  
    wide_table <- x %>% 
        dplyr::select_(samples, otus, value) %>% 
        tidyr::spread_(otus, value, fill = 0)
    permanova <- vegan::adonis(as.formula(paste("wide_table[,2:ncol(wide_table)] ~ ", formula, sep = "")), data = metadata, dist = dist)
    return(permanova)
}

Phyla Stuff

Differential Abundance

safe_glm <- possibly(glm, NA_real_)
safe_glm.nb <- possibly(glm.nb, NA_real_)
nExp2 <- nExp %>% 
  ungroup() %>% 
  mutate(variable = factor(variable)) %>% 
  group_by(SampleID) %>% 
  nest() %>% 
  mutate(rare = map(data, ~raref(., sampling_depth = 15000, value = "value"))) %>% 
  unnest(rare)
pois_glm_plant <- nExp2 %>% 
  filter(Compartment != "Bulk Soil") %>% 
  group_by(variable) %>% 
  filter(sum(rare_value > 0) / n() > 0.1) %>% 
  mutate(host_common_name = relevel(factor(host_common_name), ref = "Rice")) %>% 
  group_by(variable, Compartment) %>% 
  nest() %>%
  mutate(models = map(data, ~suppressWarnings(safe_glm.pois(rare_value ~ host_common_name + offset(log2(depth)), family = poisson, .))))
nb_glm_plant <- nExp2 %>% 
  filter(Compartment != "Bulk Soil") %>% 
  group_by(variable) %>% 
  filter(sum(rare_value > 0) / n() > 0.1) %>% 
  mutate(host_common_name = relevel(factor(host_common_name), ref = "Rice")) %>% 
  group_by(variable, Compartment) %>% 
  nest() %>%
  mutate(models = map(data, ~suppressWarnings(safe_glm.nb(rare_value ~ host_common_name + offset(log2(depth)), .))))
lm_plant <- nExp2 %>% 
  filter(Compartment != "Bulk Soil") %>% 
  group_by(variable) %>% 
  filter(sum(rare_value > 0) / n() > 0.1) %>% 
  mutate(host_common_name = relevel(factor(host_common_name), ref = "Rice")) %>% 
  group_by(variable, Compartment) %>% 
  nest() %>%
  mutate(models = map(data, ~lm(log2((RA * 1000) + 1) ~ host_common_name, .)))

LS0tCnRpdGxlOiAiTmF0aXZlIFBsYW50cyBBbmFseXNpcyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkodmVnYW4pCmxpYnJhcnkoYnJvb20pCmxpYnJhcnkoTUFTUykKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoYnJvb20pCmxpYnJhcnkodGlkeU1CKQpgYGAKCmBgYHtyfQojIyBEbyBOb3QgUnVuCiN3RXhwIDwtIHJlYWRSRFMoIn4vUk1CL1NvaWxEb21lc3RpY2F0aW9uL0RhdGEvd0V4cC5yZHMiKQojd0V4cCAlPiUgCiMgIGZpbHRlcihTaXRlID09ICJBcmthbnNhcyIpICU+JSAKIyAgdW5ncm91cCgpICU+JSAKIyAgc2F2ZVJEUygifi9STUIvU29pbERvbWVzdGljYXRpb24vRGF0YS9uYXRpdmVfcGxhbnRzX2RhdGEucmRzIikKCm5FeHAgPC0gcmVhZFJEUygifi9STUIvU29pbERvbWVzdGljYXRpb24vRGF0YS9uYXRpdmVfcGxhbnRzX2RhdGEucmRzIikgJT4lIGZpbHRlcihTYW1wbGVJRCAhPSAiQXJ3LjIyIikgJT4lIAogIG11dGF0ZShjcG0gPSByb3VuZCh2YWx1ZSAqICgxMDAwMDAwIC8gZGVwdGgpKSkKdGF4IDwtIHJlYWRSRFMoIn4vUk1CL1NvaWxEb21lc3RpY2F0aW9uL0RhdGEvZ2dfb3R1c190YXgucmRzIikKYGBgCgpgYGB7cn0KcmFyZWYgPC0gZnVuY3Rpb24oeCwgc2FtcGxpbmdfZGVwdGgsIHZhbHVlID0gInZhbHVlIiwgb3R1cyA9ICJ2YXJpYWJsZSIpIHsKICByYXJlX3ZhbHVlcyA8LSBkYXRhLmZyYW1lKHRhYmxlKHNhbXBsZSh4JGB2YXJpYWJsZWAsIHNhbXBsaW5nX2RlcHRoLCByZXBsYWNlID0gVCwgcHJvYiA9IHgkYHZhbHVlYC94JGRlcHRoKSkpCiAgbmFtZXMocmFyZV92YWx1ZXMpIDwtIGMob3R1cywgInJhcmVfdmFsdWUiKQogIHJldHVybihzdXBwcmVzc01lc3NhZ2VzKGxlZnRfam9pbih4LCByYXJlX3ZhbHVlcywgYnkgPSBvdHVzKSAlPiUgcmVwbGFjZV9uYShsaXN0KHJhcmVfdmFsdWUgPSAwKSkpKQp9CmBgYAoKCmBgYHtyfSAKblBDIDwtIHRpZHlfcGNvYShuRXhwICU+JSBncm91cF9ieSh2YXJpYWJsZSkgJT4lIGZpbHRlcihzdW0odmFsdWUpID4gMCkgJT4lIG11dGF0ZShSQSA9IFJBKjEwMDApLCBkaXN0ID0gImJyYXkiLCB2YWx1ZSA9ICJSQSIpCm5QQyRheGVzICU+JSAKICBnZ3Bsb3QoYWVzKE1EUzEsIE1EUzIsIGNvbG9yID0gaG9zdF9jb21tb25fbmFtZSkpICsKICBnZW9tX3BvaW50KHNpemUgPSAzLCBhbHBoYSA9IDAuNykgKwogIHN0YXRfZWxsaXBzZShhZXMoZ3JvdXAgPSBDb21wYXJ0bWVudCksIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlNldDEiLCBkaXJlY3Rpb24gPSAtMSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgbGFicyh4ID0gcGFzdGUoIlBDbzEgKCIsIHJvdW5kKG5QQyRlaWdlbl92YWxzWzFdICogMTAwLCAyKSwgIiUpIiwgc2VwID0gIiIpLCB5ID0gcGFzdGUoIlBDbzIgKCIsIHJvdW5kKG5QQyRlaWdlbl92YWxzWzJdICogMTAwLCAyKSwgIiUpIiwgc2VwID0gIiIpKQpgYGAKYGBge3J9CmxvbmdfYWRvbmlzKG5FeHAgJT4lIG11dGF0ZShSQTIgPSBsb2cyKChSQSoxMDAwKSArIDEpKSwgdmFsdWUgPSAiUkEyIiwgZm9ybXVsYSA9ICJDb21wYXJ0bWVudCAqIGhvc3RfY29tbW9uX25hbWUiKQpuRXhwICU+JSAKICBtdXRhdGUoUkEyID0gbG9nMigoUkEqMTAwMCkgKyAxKSkgJT4lIAogIGdyb3VwX2J5KENvbXBhcnRtZW50KSAlPiUgCiAgbmVzdCgpICU+JSAKICBmaWx0ZXIoQ29tcGFydG1lbnQgIT0gIkJ1bGsgU29pbCIpICU+JSAKICBtdXRhdGUoYWQgPSBtYXAoZGF0YSwgfmxvbmdfYWRvbmlzKC4sIHZhbHVlID0gIlJBMiIsIGZvcm11bGEgPSAiaG9zdF9jb21tb25fbmFtZSIpKSkKYGBgCgojIyBQaHlsYSBTdHVmZgpgYGB7cn0KcGh5bGFfYWJ1bmQgPC0gbkV4cCAlPiUgCiAgaW5uZXJfam9pbih0YXgsIGJ5ID0gInZhcmlhYmxlIikgJT4lIAogIGdyb3VwX2J5KFNhbXBsZUlELCBDb21wYXJ0bWVudCwgaG9zdF9jb21tb25fbmFtZSwgUGh5bHVtMiwgZGVwdGgpICU+JSAKICBzdW1tYXJpc2UocGh5X3RvdGFsID0gc3VtKHZhbHVlKSkgJT4lIAogIG11dGF0ZShwcm9wID0gKHBoeV90b3RhbCArIDEpIC8gKGRlcHRoICsgMSkpICU+JSAKICBncm91cF9ieShDb21wYXJ0bWVudCkgJT4lIAogIG11dGF0ZShhbHBoYSA9IGZpdGRpc3RyKHByb3AsIGRiZXRhLCBzdGFydCA9IGxpc3Qoc2hhcGUxID0gMSwgc2hhcGUyID0gMTApKSRlc3RpbWF0ZVsxXSwKICAgICAgICAgYmV0YSA9IGZpdGRpc3RyKHByb3AsIGRiZXRhLCBzdGFydCA9IGxpc3Qoc2hhcGUxID0gMSwgc2hhcGUyID0gMTApKSRlc3RpbWF0ZVsyXSkgJT4lIAogIG11dGF0ZShlbXBfZXN0aW1hdGUgPSAocGh5X3RvdGFsICsgYWxwaGEgKyAxKSAvIChkZXB0aCArIDEgKyBhbHBoYSArIGJldGEpKQoKcGh5X2hvc3RfbG0gPC0gcGh5bGFfYWJ1bmQgJT4lIAogIGdyb3VwX2J5KENvbXBhcnRtZW50LCBQaHlsdW0yKSAlPiUgCiAgZmlsdGVyKGhvc3RfY29tbW9uX25hbWUgIT0gIlNvaWwiKSAlPiUgCiAgbXV0YXRlKGhvc3RfY29tbW9uX25hbWUgPSBmY3RfcmVsZXZlbChob3N0X2NvbW1vbl9uYW1lLCAiUmljZSIsICJSZWRzdGVtIiwgIlNlZGdlIiwgIk11ZHBsYW50YWluIikpICU+JSAKICBuZXN0KCkgJT4lIAogIG11dGF0ZShtb2RlbHMgPSBtYXAoZGF0YSwgfnRpZHkobG0obG9nMihlbXBfZXN0aW1hdGUpIH4gaG9zdF9jb21tb25fbmFtZSwgLikpKSkgJT4lIAogIHVubmVzdChtb2RlbHMpICU+JSAKICBmaWx0ZXIodGVybSAhPSAiKEludGVyY2VwdCkiKSAlPiUgCiAgbXV0YXRlKHRlcm0gPSBnc3ViKCJob3N0X2NvbW1vbl9uYW1lIiwgIiIsIHRlcm0pKSAlPiUgCiAgZ3JvdXBfYnkoQ29tcGFydG1lbnQpICU+JSAKICBtdXRhdGUocC5hZGogPSBwLmFkanVzdChwLnZhbHVlLCAiZmRyIikpCgpwaHlfaG9zdF9sbTEgPC0gcGh5bGFfYWJ1bmQgJT4lIAogIGdyb3VwX2J5KENvbXBhcnRtZW50LCBQaHlsdW0yKSAlPiUgCiAgZmlsdGVyKGhvc3RfY29tbW9uX25hbWUgIT0gIlNvaWwiKSAlPiUgCiAgbXV0YXRlKGhvc3RfY29tbW9uX25hbWUgPSBmY3RfcmVsZXZlbChob3N0X2NvbW1vbl9uYW1lLCAiUmljZSIsICJSZWRzdGVtIiwgIlNlZGdlIiwgIk11ZHBsYW50YWluIikpICU+JSAKICBuZXN0KCkgJT4lIAogIG11dGF0ZShtb2RlbHMgPSBtYXAoZGF0YSwgfnRpZHkobG0obG9nMihwaHlfdG90YWwgKyAxKSB+IGhvc3RfY29tbW9uX25hbWUsIC4pKSkpICU+JSAKICB1bm5lc3QobW9kZWxzKSAlPiUgCiAgZmlsdGVyKHRlcm0gIT0gIihJbnRlcmNlcHQpIikgJT4lIAogIG11dGF0ZSh0ZXJtID0gZ3N1YigiaG9zdF9jb21tb25fbmFtZSIsICIiLCB0ZXJtKSkgJT4lIAogIGdyb3VwX2J5KENvbXBhcnRtZW50KSAlPiUgCiAgbXV0YXRlKHAuYWRqID0gcC5hZGp1c3QocC52YWx1ZSwgImZkciIpKQoKcGh5X2NvbXBfbG0gPC0gcGh5bGFfYWJ1bmQgJT4lIAogIGdyb3VwX2J5KFBoeWx1bTIpICU+JSAKICBuZXN0KCkgJT4lIAogIG11dGF0ZShtb2RlbHMgPSBtYXAoZGF0YSwgfnRpZHkobG0obG9nMihlbXBfZXN0aW1hdGUpIH4gQ29tcGFydG1lbnQsIC4pKSkpICU+JSAKICB1bm5lc3QobW9kZWxzKSAlPiUgCiAgZmlsdGVyKHRlcm0gIT0gIihJbnRlcmNlcHQpIikgJT4lIAogIG11dGF0ZSh0ZXJtID0gZ3N1YigiQ29tcGFydG1lbnQiLCAiIiwgdGVybSkpICU+JSAKICBtdXRhdGUocC5hZGogPSBwLmFkanVzdChwLnZhbHVlLCAiYm9uIikpCgpwaHlfY29tcF9sbSAlPiUgCiAgZmlsdGVyKHAuYWRqIDw9IDAuMDUpICU+JSAKICBtdXRhdGUoUGh5bHVtMiA9IGZjdF9yZW9yZGVyKGZhY3RvcihQaHlsdW0yKSwgZXN0aW1hdGUpKSAlPiUgCiAgZ2dwbG90KGFlcyhQaHlsdW0yLCBlc3RpbWF0ZSkpICsKICBnZW9tX3BvaW50KCkgKwogIGZhY2V0X2dyaWQoLiB+IHRlcm0pCgpwaHlfY29tcF9sbSAlPiUgCiAgaW5uZXJfam9pbihwaHlsYV9hYnVuZCAlPiUgZ3JvdXBfYnkoUGh5bHVtMiwgQ29tcGFydG1lbnQpICU+JSBzdW1tYXJpc2UobWVhbl9hYiA9IG1lYW4oZW1wX2VzdGltYXRlKSksIGJ5ID0gYyhjKCJ0ZXJtIiA9ICJDb21wYXJ0bWVudCIpLCAiUGh5bHVtMiIpKSAlPiUgCiAgbXV0YXRlKENvbXBhcnRtZW50ID0gZmN0X3JlbGV2ZWwodGVybSwgIlJoaXpvc3BoZXJlIiwgIkVuZG9zcGhlcmUiKSkgJT4lCiAgZ2dwbG90KGFlcyhDb21wYXJ0bWVudCwgZXN0aW1hdGUsIGdyb3VwID0gUGh5bHVtMiwgY29sb3IgPSBpZmVsc2UocC5hZGogPD0gMC4wNSwgQ29tcGFydG1lbnQsICJucyIpLCBzaGFwZSA9IGlmZWxzZShwLmFkaiA8PSAwLjA1LCAic2lnIiwgIm5zIiksIHNpemUgPSBsb2cyKG1lYW5fYWIgKiAxMDAwKSkpICsKICBnZW9tX2xpbmUoY29sb3IgPSAnYmxhY2snLCBhbHBoYSA9IDAuNSwgc2l6ZSA9IDAuNSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxLCAxNikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiZGFya21hZ2VudGEiLCAic3RlZWxibHVlIiwgImJsYWNrIikpICsKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDAsMTApKSArCiAgdGhlbWVfbWluaW1hbCgpCgpwaHlfaG9zdF9sbSAlPiUgCiAgZmlsdGVyKHAuYWRqIDw9IDAuMDUpICU+JSB1bmdyb3VwKCkgJT4lIAogIG11dGF0ZShDb21wYXJ0bWVudCA9IGZjdF9yZWxldmVsKENvbXBhcnRtZW50LCAiUmhpem9zcGhlcmUiLCAiRW5kb3NwaGVyZSIpKSAlPiUgCiAgZ2dwbG90KGFlcyhQaHlsdW0yLCB0ZXJtLCBmaWxsID0gZXN0aW1hdGUpKSArCiAgZ2VvbV90aWxlKCkgKwogIGZhY2V0X2dyaWQoQ29tcGFydG1lbnR+LikgKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKGxvdyA9ICJnb2xkIiwgaGlnaCA9ICJkb2RnZXJibHVlIiwgbWlkID0gJ2JsYWNrJykgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzAsIGhqdXN0ID0gMSkpCiAgCnBoeWxhX2FidW5kICU+JSAKICBncm91cF9ieShQaHlsdW0yKSAlPiUgCiAgbmVzdCgpICU+JSAKICBtdXRhdGUodG90YWwgPSBtYXBfZGJsKGRhdGEsIH5zdW0oLngkcHJvcCkpKSAlPiUgCiAgdG9wX24oMTUsIHRvdGFsKSAlPiUgCiAgdW5uZXN0KGRhdGEpICU+JSAKICBtdXRhdGUoQ29tcGFydG1lbnQgPSBmY3RfcmVsZXZlbChDb21wYXJ0bWVudCwgIkJ1bGsgU29pbCIsICJSaGl6b3NwaGVyZSIsICJFbmRvc3BoZXJlIikpICU+JSAKICBncm91cF9ieShDb21wYXJ0bWVudCwgaG9zdF9jb21tb25fbmFtZSwgU2FtcGxlSUQpICU+JSAKICBuZXN0KCkgJT4lIAogIGdyb3VwX2J5KENvbXBhcnRtZW50KSAlPiUgCiAgYXJyYW5nZShob3N0X2NvbW1vbl9uYW1lKSAlPiUgCiAgbXV0YXRlKG9yZGVyID0gMTpuKCkpICU+JSAKICB1bm5lc3QoKSAlPiUgCiAgZ2dwbG90KGFlcyhvcmRlciwgcHJvcCAqIDEwMCwgZmlsbCA9IFBoeWx1bTIpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gb3JkZXIsIHkgPSAtMiwgY29sb3IgPSBob3N0X2NvbW1vbl9uYW1lKSkgKwogIGZhY2V0X2dyaWQoLn5Db21wYXJ0bWVudCwgc2NhbGVzID0gImZyZWVfeCIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKGJyZXdlci5wYWwoMTEsICJSZEd5IiksYnJld2VyLnBhbCg1LCAiQmx1ZXMiKVstMV0pKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiU2V0MSIsIGRpcmVjdGlvbiA9IC0xKSArCiAgbGFicyh4ID0gIiIsIHkgPSAiUGVyY2VudCBvZiBSZWFkcyIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQpgYGAKCiMjIERpZmZlcmVudGlhbCBBYnVuZGFuY2UKYGBge3J9CnNhZmVfZ2xtIDwtIHBvc3NpYmx5KGdsbSwgTkFfcmVhbF8pCnNhZmVfZ2xtLm5iIDwtIHBvc3NpYmx5KGdsbS5uYiwgTkFfcmVhbF8pCgpuRXhwMiA8LSBuRXhwICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIG11dGF0ZSh2YXJpYWJsZSA9IGZhY3Rvcih2YXJpYWJsZSkpICU+JSAKICBncm91cF9ieShTYW1wbGVJRCkgJT4lIAogIG5lc3QoKSAlPiUgCiAgbXV0YXRlKHJhcmUgPSBtYXAoZGF0YSwgfnJhcmVmKC4sIHNhbXBsaW5nX2RlcHRoID0gMTUwMDAsIHZhbHVlID0gInZhbHVlIikpKSAlPiUgCiAgdW5uZXN0KHJhcmUpCgpwb2lzX2dsbV9wbGFudCA8LSBuRXhwMiAlPiUgCiAgZmlsdGVyKENvbXBhcnRtZW50ICE9ICJCdWxrIFNvaWwiKSAlPiUgCiAgZ3JvdXBfYnkodmFyaWFibGUpICU+JSAKICBmaWx0ZXIoc3VtKHJhcmVfdmFsdWUgPiAwKSAvIG4oKSA+IDAuMSkgJT4lIAogIG11dGF0ZShob3N0X2NvbW1vbl9uYW1lID0gcmVsZXZlbChmYWN0b3IoaG9zdF9jb21tb25fbmFtZSksIHJlZiA9ICJSaWNlIikpICU+JSAKICBncm91cF9ieSh2YXJpYWJsZSwgQ29tcGFydG1lbnQpICU+JSAKICBuZXN0KCkgJT4lCiAgbXV0YXRlKG1vZGVscyA9IG1hcChkYXRhLCB+c3VwcHJlc3NXYXJuaW5ncyhzYWZlX2dsbS5wb2lzKHJhcmVfdmFsdWUgfiBob3N0X2NvbW1vbl9uYW1lICsgb2Zmc2V0KGxvZzIoZGVwdGgpKSwgZmFtaWx5ID0gcG9pc3NvbiwgLikpKSkKCm5iX2dsbV9wbGFudCA8LSBuRXhwMiAlPiUgCiAgZmlsdGVyKENvbXBhcnRtZW50ICE9ICJCdWxrIFNvaWwiKSAlPiUgCiAgZ3JvdXBfYnkodmFyaWFibGUpICU+JSAKICBmaWx0ZXIoc3VtKHJhcmVfdmFsdWUgPiAwKSAvIG4oKSA+IDAuMSkgJT4lIAogIG11dGF0ZShob3N0X2NvbW1vbl9uYW1lID0gcmVsZXZlbChmYWN0b3IoaG9zdF9jb21tb25fbmFtZSksIHJlZiA9ICJSaWNlIikpICU+JSAKICBncm91cF9ieSh2YXJpYWJsZSwgQ29tcGFydG1lbnQpICU+JSAKICBuZXN0KCkgJT4lCiAgbXV0YXRlKG1vZGVscyA9IG1hcChkYXRhLCB+c3VwcHJlc3NXYXJuaW5ncyhzYWZlX2dsbS5uYih2YWx1ZSB+IGhvc3RfY29tbW9uX25hbWUgKyBvZmZzZXQobG9nMihkZXB0aCkpLCAuKSkpKQoKbG1fcGxhbnQgPC0gbkV4cDIgJT4lIAogIGZpbHRlcihDb21wYXJ0bWVudCAhPSAiQnVsayBTb2lsIikgJT4lIAogIGdyb3VwX2J5KHZhcmlhYmxlKSAlPiUgCiAgZmlsdGVyKHN1bShyYXJlX3ZhbHVlID4gMCkgLyBuKCkgPiAwLjEpICU+JSAKICBtdXRhdGUoaG9zdF9jb21tb25fbmFtZSA9IHJlbGV2ZWwoZmFjdG9yKGhvc3RfY29tbW9uX25hbWUpLCByZWYgPSAiUmljZSIpKSAlPiUgCiAgZ3JvdXBfYnkodmFyaWFibGUsIENvbXBhcnRtZW50KSAlPiUgCiAgbmVzdCgpICU+JQogIG11dGF0ZShtb2RlbHMgPSBtYXAoZGF0YSwgfmxtKGxvZzIoKFJBICogMTAwMCkgKyAxKSB+IGhvc3RfY29tbW9uX25hbWUsIC4pKSkKYGBgCgpgYGB7cn0KcG9pc19nbG0gJT4lIAogIHVubmVzdChtYXAobW9kZWxzLCB+dGlkeSguKSkpICU+JSAKICBtdXRhdGUocC5hZGogPSBwLmFkanVzdChwLnZhbHVlLCAiZmRyIikpICU+JSAKICBmaWx0ZXIodGVybSAhPSAiKEludGVyY2VwdCkiKSAlPiUgCiAgbXV0YXRlKGRpcmVjdGlvbiA9IGlmZWxzZShlc3RpbWF0ZSA+IDAsICJXZWVkIiwgIlJpY2UiKSkgJT4lIAogIGZpbHRlcihwLmFkaiA8PSAwLjA1KSAlPiUgCiAgZ3JvdXBfYnkoQ29tcGFydG1lbnQsIGRpcmVjdGlvbiwgdmFyaWFibGUpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIAogIGdyb3VwX2J5KENvbXBhcnRtZW50LCBkaXJlY3Rpb24pICU+JSAKICBtdXRhdGUodG90YWwgPSBuKCkpICU+JSAKICBmaWx0ZXIobiA9PSAzKSAlPiUgCiAgZ3JvdXBfYnkoQ29tcGFydG1lbnQsIGRpcmVjdGlvbiwgdG90YWwpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkKCm5iX2dsbSAlPiUgCiAgdW5uZXN0KG1hcChtb2RlbHMsIH50aWR5KC4pKSkgJT4lIAogIG11dGF0ZShwLmFkaiA9IHAuYWRqdXN0KHAudmFsdWUsICJmZHIiKSkgJT4lIAogIGZpbHRlcih0ZXJtICE9ICIoSW50ZXJjZXB0KSIpICU+JSAKICBtdXRhdGUoZGlyZWN0aW9uID0gaWZlbHNlKGVzdGltYXRlID4gMCwgIldlZWQiLCAiUmljZSIpKSAlPiUgCiAgZmlsdGVyKHAuYWRqIDw9IDAuMDUpICU+JSAKICBncm91cF9ieShDb21wYXJ0bWVudCwgZGlyZWN0aW9uLCB2YXJpYWJsZSkgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUgCiAgZ3JvdXBfYnkoQ29tcGFydG1lbnQsIGRpcmVjdGlvbikgJT4lIAogIG11dGF0ZSh0b3RhbCA9IG4oKSkgJT4lIAogIGZpbHRlcihuID09IDMpICU+JSAKICBncm91cF9ieShDb21wYXJ0bWVudCwgZGlyZWN0aW9uLCB0b3RhbCkgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKQoKbG1fcGxhbnQgJT4lIAogIHVubmVzdChtYXAobW9kZWxzLCB+dGlkeSguKSkpICU+JSAKICBtdXRhdGUocC5hZGogPSBwLmFkanVzdChwLnZhbHVlLCAiZmRyIikpICU+JSAKICBmaWx0ZXIodGVybSAhPSAiKEludGVyY2VwdCkiKSAlPiUgCiAgbXV0YXRlKGRpcmVjdGlvbiA9IGlmZWxzZShlc3RpbWF0ZSA+IDAsICJXZWVkIiwgIlJpY2UiKSkgJT4lIAogIGZpbHRlcihwLmFkaiA8PSAwLjA1KSAlPiUgCiAgZ3JvdXBfYnkoQ29tcGFydG1lbnQsIGRpcmVjdGlvbiwgdmFyaWFibGUpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIAogIGdyb3VwX2J5KENvbXBhcnRtZW50LCBkaXJlY3Rpb24pICU+JSAKICBtdXRhdGUodG90YWwgPSBuKCkpICU+JSAKICBmaWx0ZXIobiA9PSAzKSAlPiUgCiAgZ3JvdXBfYnkoQ29tcGFydG1lbnQsIGRpcmVjdGlvbiwgdG90YWwpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkKCmxpYnJhcnkoZWRnZVIpCndpZGUKYGBgCgpgYGB7cn0Kc2lnbmlmaWNhbnRfb3R1cyA8LSBiaW5kX3Jvd3MobG1fcGxhbnQgJT4lIG11dGF0ZShtb2RlbCA9ICJsbSIpLAogICAgICAgICAgbmJfZ2xtX3BsYW50ICU+JSBtdXRhdGUobW9kZWwgPSAiZ2xtLm5iIikpICU+JSAjLAogICAgICAgICAjIHBvaXNfZ2xtX3BsYW50ICU+JSBtdXRhdGUobW9kZWwgPSAiZ2xtLnBvaXMiKSkgJT4lIAogIHVubmVzdChtYXAobW9kZWxzLCB+dGlkeSguKSkpICU+JSAKICBmaWx0ZXIodGVybSAhPSAiKEludGVyY2VwdCkiKSAlPiUgCiAgZ3JvdXBfYnkoQ29tcGFydG1lbnQsIG1vZGVsKSAlPiUgCiAgbXV0YXRlKHAuYWRqID0gcC5hZGp1c3QocC52YWx1ZSwgImZkciIpKSAlPiUgCiAgZmlsdGVyKHAuYWRqIDw9IDAuMDUpICU+JSAKICBtdXRhdGUoZGlyZWN0aW9uID0gaWZlbHNlKGVzdGltYXRlID4gMCwgIldlZWQiLCAiUmljZSIpKSAKCnNpZ25pZmljYW50X290dXMgJT4lIAogIGdyb3VwX2J5KENvbXBhcnRtZW50LCBkaXJlY3Rpb24sIHZhcmlhYmxlLCB0ZXJtKSAlPiUgCiAgbXV0YXRlKG4gPSBuKCkpICU+JSAKICBmaWx0ZXIobiA9PSAxKSAlPiUgCiAgZ2dwbG90KGFlcyhtb2RlbCwgZmlsbCA9IG1vZGVsKSkgKwogIGdlb21fYmFyKCkgKwogIGZhY2V0X2dyaWQoQ29tcGFydG1lbnQgfiB0ZXJtKQoKc2lnbmlmaWNhbnRfb3R1cyAlPiUgCiAgZ3JvdXBfYnkoQ29tcGFydG1lbnQsIGRpcmVjdGlvbiwgdmFyaWFibGUsIHRlcm0pICU+JSAKICBtdXRhdGUobiA9IG4oKSkgJT4lIAogIGdncGxvdChhZXMobiwgZmlsbCA9IGRpcmVjdGlvbikpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBmYWNldF9ncmlkKENvbXBhcnRtZW50IH4gdGVybSkKCnRhYmxlKHBhc3RlKHNpZ25pZmljYW50X290dXMkbW9kZWwsIHNpZ25pZmljYW50X290dXMkZGlyZWN0aW9uKSkKCnNpZ25pZmljYW50X290dXMgJT4lIGdyb3VwX2J5KENvbXBhcnRtZW50LCBkaXJlY3Rpb24sIHZhcmlhYmxlLCB0ZXJtKSAlPiUgCiAgbXV0YXRlKG4gPSBuKCkpICU+JSAKICBmaWx0ZXIobiA9PSAxKSAlPiUgCiAgZmlsdGVyKG1vZGVsICE9ICJsbSIpCmBgYAoKCmBgYHtyfQpuRXhwMiAlPiUgCiAgZmlsdGVyKHZhcmlhYmxlID09ICIxMTA4NzI2IiAmIENvbXBhcnRtZW50ID09ICJSaGl6b3NwaGVyZSIpICU+JSAKICBnZ3Bsb3QoYWVzKGhvc3RfY29tbW9uX25hbWUsIFJBLCBjb2xvciA9IGhvc3RfY29tbW9uX25hbWUpKSArCiAgZ2VvbV9qaXR0ZXIoaGVpZ2h0ID0gMCwgd2lkdGggPSAwLjEpCgpsbV9wbGFudCAlPiUgZmlsdGVyKHZhcmlhYmxlID09ICIxMTEwMzAzIikgJT4lIAogIHVubmVzdChtYXAobW9kZWxzLCB+dGlkeSguKSkpCnRheFsiMTA5MTYyNSIsXQpgYGAKCg==